package com.campus.service.impl;

import com.campus.common.StringUtils;
import com.campus.exception.BusinessException;
import com.campus.service.UserService;
import com.campus.dao.UserDao;
import com.campus.model.User;
import com.campus.utils.JwtUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @desc: 用户服务实现类
 * @author: hjm
 * @date: 2024/11/22
 */
@Service
public class UserServiceImpl implements UserService {

    private final UserDao userDao;

    // 构造函数注入UserDao
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    /**
     * 用户登录
     * @param loginName 登录名
     * @param password 密码
     * @return 生成的JWT令牌
     * @throws BusinessException 如果用户名或密码错误
     */
    @Override
    public String login(String loginName, String password) {
        // 调用UserDao的login方法查询用户信息
        User user = userDao.login(loginName, password);

        // 获取盐值并加密密码
        String salt = StringUtils.getSalt(loginName);
        String encryptedPassword = StringUtils.md5Encoder(password, salt);

        // 验证用户名和密码是否匹配
        if (user == null || !encryptedPassword.equals(user.getPassword())) {
            throw new BusinessException("用户名或密码错误");
        }

        // 生成并返回JWT令牌
        return JwtUtil.generateToken(user.getLoginName());
    }

    /**
     * 创建新用户
     * @param user 用户对象
     * @return 创建的用户对象
     * @throws RuntimeException 如果创建用户失败
     */
    @Override
    public User createUser(User user) {
        if (userDao.addUser(user) > 0) {
            return user;
        }
        throw new RuntimeException("创建用户失败");
    }

    /**
     * 根据ID获取用户
     * @param id 用户ID
     * @return 用户对象
     * @throws BusinessException 如果未找到用户
     */
    @Override
    public User getUserById(Long id) {
        return userDao.queryUser(String.valueOf(id)).stream()
                .findFirst()
                .orElseThrow(() -> new BusinessException("根据ID未找到用户：" + id));
    }

    /**
     * 根据用户名获取用户
     * @param username 用户名
     * @return 用户对象
     * @throws BusinessException 如果未找到用户
     */
    @Override
    public User getUserByUsername(String username) {
        return userDao.queryUser(username).stream()
                .findFirst()
                .orElseThrow(() -> new BusinessException("未找到用户名为：" + username + " 的用户"));
    }

    /**
     * 获取所有用户
     * @return 用户列表
     * @throws BusinessException 如果未找到任何用户
     */
    @Override
    public List<User> getAllUsers() {
        List<User> users = userDao.queryUser("");
        if (users == null || users.isEmpty()) {
            throw new BusinessException("未找到任何用户");
        }
        return users;
    }
}